package org.example.pingpong.service;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import org.example.pingpong.domain.dto.UserFormDTO;
import org.example.pingpong.domain.po.User;
import org.example.pingpong.domain.vo.Result;

import java.util.List;

/**
 * @description 针对表【user】的数据库操作Service接口
 * 提供了用户相关的业务逻辑方法
 * @createDate 2025-02-12 18:53:05
 */
public interface UserService extends IService<User> {

    /**
     * 创建新用户
     *
     * @param validator 新建用户时的校验数据
     * @return 新建的用户DTO对象
     */
    UserFormDTO createUser(UserFormDTO validator);

    /**
     * 校验用户数据是否合法
     * 在创建新用户时，检查相关数据是否符合规则
     *
     * @param validator 用户表单数据
     * @return 校验结果，包含错误信息或成功状态
     */
    Result userDataCheck(UserFormDTO validator);

    /**
     * 校验邮箱和验证码的有效性
     *
     * @param email 用户邮箱
     * @param code  验证码
     * @return 校验结果，包含错误信息或成功状态
     */
    public Result EmailDataCheck(String email, String code);

    public boolean checkUserPassword(String password, String encryptedPassword);

    /**
     * 根据用户名检查用户是否已存在
     *
     * @param username 用户名
     * @return 如果用户存在返回 true，否则返回 false
     */
    boolean checkUserExistByUsername(String username);

    /**
     * 根据邮箱检查用户是否已存在
     *
     * @param email 用户邮箱
     * @return 如果邮箱已被注册，返回 true，否则返回 false
     */
    boolean checkUserExistByEmail(String email);

    /**
     * 创建用户的身份信息（用户名、密码、昵称、邮箱等）
     *
     * @param userId     用户ID
     * @param identifier 用户名或其他身份标识
     * @param credential 用户的认证信息（如密码）
     * @param nickName   用户昵称
     * @param email      用户邮箱
     * @return 完整的用户对象
     */
    User createUsernamePasswordIdentity(Integer userId, String identifier, String credential, String nickName, String email);

    /**
     * 删除用户数据
     *
     * @param wrapper 查询条件包装器
     * @return 删除的记录数
     */
    int del(Wrapper wrapper);

    /**
     * 获取符合条件的用户列表
     *
     * @param wrapper 查询条件包装器
     * @return 用户列表
     */
    List<User> selectList(Wrapper<User> wrapper);

    /**
     * 更新用户信息
     *
     * @param user    更新的用户对象
     * @param wrapper 查询条件包装器
     * @return 更新的记录数
     */
    int up(User user, Wrapper wrapper);

    /**
     * @param email
     * @param newPwd
     * @return 找回结果
     */
    public Result findPassword(String email, String newPwd);

    /**
     * 对密码进行加密
     *
     * @param password 明文密码
     * @return 加密后的密码
     */
    String encryptPassword(String password);
}
